#include "BlockQueue.hpp"
#include "Task.hpp"
#include <ctime>
#include <functional>
using namespace BlockQueueModule;
using namespace TaskModule;
using task_t = std::function<void()>;

void test()
{
    cout << "haha test.." << endl;
}

void Log()
{
    cout << "Log task..." << endl;
}

void *Consumer(void *args)
{
    BlockQueue<task_t> *bq = static_cast<BlockQueue<task_t> *>(args);
    while (true)
    {
        task_t t;
        // Task t;
        //  1.先从bq拿到数据
        bq->Pop(&t);

        // 2.做加工处理
        t();

        // t.Excute();
        // printf("Consumer 处理完一个任务：%d+%d=%d\n", t.X(), t.Y(), t.Reasult());
    }
}

void *Producter(void *args)
{
    // BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *>(args);
    BlockQueue<task_t> *bq = static_cast<BlockQueue<task_t> *>(args);
    // 1.从外部获取数据
    while (true)
    {
        sleep(1);
        // int x = rand() % 10 + 1;
        // int y = rand() % 20 + 1;
        // Task t(x, y);
        // 2.生产到bq中
        bq->Enqueue(test);
        printf("生产了一个任务..\n");
        // printf("生产了一个任务:%d+%d=?\n", t.X(), t.Y());
    }
}

int main()
{
    srand(time(nullptr) ^ getpid());
    // 看到同一份阻塞队列
    BlockQueue<task_t> *bq = new BlockQueue<task_t>(5); // 共享资源->保护成临界资源

    // 单生产 单消费
    pthread_t c1, p1, c2, p2, p3;
    pthread_create(&c1, nullptr, Consumer, bq);
    pthread_create(&p1, nullptr, Producter, bq);
    pthread_join(c1, nullptr);
    pthread_join(p1, nullptr);
    return 0;
}